// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_COMPILER_ALLOCATION_BUILDER_INL_H_
#define V8_COMPILER_ALLOCATION_BUILDER_INL_H_

#include "src/compiler/allocation-builder.h"

#include "src/compiler/access-builder.h"
#include "src/objects/map-inl.h"

namespace v8 {
namespace internal {
    namespace compiler {

        void AllocationBuilder::AllocateContext(int variadic_part_length,
            Handle<Map> map)
        {
            DCHECK(
                IsInRange(map->instance_type(), FIRST_CONTEXT_TYPE, LAST_CONTEXT_TYPE));
            DCHECK_NE(NATIVE_CONTEXT_TYPE, map->instance_type());
            int size = Context::SizeFor(variadic_part_length);
            Allocate(size, AllocationType::kYoung, Type::OtherInternal());
            Store(AccessBuilder::ForMap(), map);
            STATIC_ASSERT(static_cast<int>(Context::kLengthOffset) == static_cast<int>(FixedArray::kLengthOffset));
            Store(AccessBuilder::ForFixedArrayLength(),
                jsgraph()->Constant(variadic_part_length));
        }

        // Compound allocation of a FixedArray.
        void AllocationBuilder::AllocateArray(int length, Handle<Map> map,
            AllocationType allocation)
        {
            DCHECK(map->instance_type() == FIXED_ARRAY_TYPE || map->instance_type() == FIXED_DOUBLE_ARRAY_TYPE);
            int size = (map->instance_type() == FIXED_ARRAY_TYPE)
                ? FixedArray::SizeFor(length)
                : FixedDoubleArray::SizeFor(length);
            Allocate(size, allocation, Type::OtherInternal());
            Store(AccessBuilder::ForMap(), map);
            Store(AccessBuilder::ForFixedArrayLength(), jsgraph()->Constant(length));
        }

    } // namespace compiler
} // namespace internal
} // namespace v8

#endif // V8_COMPILER_ALLOCATION_BUILDER_INL_H_
